package com.example.servicegateway.config;

import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

/**
 * 使用spring loadbalancer的HintBasedServiceInstanceListSupplier实现灰度
 * 这里不能使用@Configuration，这样会使该配置成为全局配置，导致serviceID为NULL，因为本身就是靠environment区分contextName来设置serviceID。
 * 必须使用@LoadBalancerClient指定服务使用灰度负载均衡器或者使用@LoadBalancerClients定义全局配置。
 * spring-cloud-starter-loadbalancer 3.0.2之后才提供HintBasedServiceInstanceListSupplier。
 *
 * 使用该loadbalancer必须在请求头定义key是X-SC-LB-Hint，请求头的key可以通过配置
 * spring.cloud.loadbalancer.hint-header-name重新定义。然后在注册中心的服务metadata定义key是hint（对应nacos服务详情里的元数据）。
 *
 * 注意：使用该loadbalancer，如果请求头定义X-SC-LB-Hint，但是注册中心的服务metadata没有定义key=hint，就会在服务列表轮询选取服务
 * @author K
 */
public class SpringHintLoadBalancerConfiguration {

    @Bean
    public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
            ConfigurableApplicationContext context) {
        return ServiceInstanceListSupplier.builder()
                .withDiscoveryClient()
                .withHints()
                .build(context);
    }
}
